package com.coincalf.mapper;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.coincalf.dto.DepthItemDTO;
import com.coincalf.dto.ForexDealOrderDTO;
import com.coincalf.dto.ForexEntrustOrderDTO;
import com.coincalf.entity.EntrustOrder;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 委托订单信息 Mapper 接口
 * </p>
 *
 * @author qiang
 * @since 2018-05-12
 */
public interface EntrustOrderMapper extends BaseMapper<EntrustOrder> {

    /**
     * 修改币币交易委托订单
     *
     * @param orderId    委托订单号
     * @param lockAmount 冻结金额
     * @param dealVolume 当前成交量
     * @param status     委托订单状态
     */
    int modifyTradeEntrustOrder(@Param("orderId") long orderId,
                                @Param("lockAmount") BigDecimal lockAmount,
                                @Param("dealVolume") BigDecimal dealVolume,
                                @Param("status") int status);

    /**
     * 修改币币交易委托订单
     *
     * @param orderId    委托订单号
     * @param lockFee    冻结手续费
     * @param lockMargin 冻结保证金
     * @param status     委托订单状态
     */
    int modifyForexEntrustOrder(@Param("orderId") long orderId,
                                @Param("lockFee") BigDecimal lockFee,
                                @Param("lockMargin") BigDecimal lockMargin,
                                @Param("status") int status);

    /**
     * 查询匹配的委托单
     *
     * @param marketId 交易对ID
     * @param type     持仓方向
     * @param price    委托价格
     * @return
     */
    EntrustOrder selectMatchEntrustOrder(@Param("marketId") Long marketId,
                                         @Param("type") int type,
                                         @Param("price") BigDecimal price);

    /**
     * 获取市场报价信息
     *
     * @param marketId 交易对ID
     * @return
     */
    BigDecimal getBuyPrice(@Param("marketId") long marketId,
                           @Param("type") int type);

    /**
     * 获取市场报价信息
     *
     * @param marketId 交易对ID
     * @return
     */
    BigDecimal getSellPrice(@Param("marketId") long marketId,
                            @Param("type") int type);

    /**
     * 查询买单深度
     *
     * @param marketId  交易对ID
     * @param mergeType 合并深度类型
     * @return
     */
    List<DepthItemDTO> queryBidsMergeDepth(@Param("marketId") long marketId, @Param("mergeType") int mergeType);

    /**
     * 查询卖单深度
     *
     * @param marketId  交易对ID
     * @param mergeType 合并深度类型
     * @return
     */
    List<DepthItemDTO> queryAskMergeDepth(@Param("marketId") long marketId, @Param("mergeType") int mergeType);

    /**
     * 创新交易今日委托
     *
     * @param wrapper
     * @return
     */
    List<ForexEntrustOrderDTO> selectTodayList(@Param("ew") Wrapper<ForexEntrustOrderDTO> wrapper);

    List<EntrustOrder> selectOrders(Pagination pagination,
                                    @Param("agencyUserId") Long agencyUserId,
                                    @Param("userName") String userName,
                                    @Param("orderId") Long orderId,
                                    @Param("typeId") String typeId,
                                    @Param("marketId") Long marketId,
                                    @Param("parentId") Long parentId,
                                    @Param("createTime") String createTime);


    Map<String, Object> selectDealOrderTotal(@Param("agencyUserId") Long agencyUserId, @Param("typeId") String typeId);

    List<ForexDealOrderDTO> selectDealOrder(Pagination pagination,
                                            @Param("agencyUserId") long agencyUserId,
                                            @Param("userName") String userName,
                                            @Param("orderId") long orderId,
                                            @Param("typeId") String typeId,
                                            @Param("marketId") long marketId,
                                            @Param("parentId") long parentId,
                                            @Param("createTime") String createTime);

    /**
     * 更新委托单
     *
     * @param orderId    订单号
     * @param dealVolume 成交数量
     * @return
     */
    int modifyEntrustBuyOrder(@Param("orderId") Long orderId, @Param("dealVolume") BigDecimal dealVolume);

    /**
     * 更新委托单
     *
     * @param orderId    订单号
     * @param dealVolume 成交数量
     * @return
     */
    int modifyEntrustSellOrder(@Param("orderId") Long orderId, @Param("dealVolume") BigDecimal dealVolume);

    /**
     * 获取委托中币币交易买一价格 取最高价
     *
     * @param marketId
     * @return
     */
    public BigDecimal selectBuyFirstPrice(@Param("marketId") Long marketId);

    /**
     * 获取委托中币币交易卖一价格 取最低价
     *
     * @param marketId
     * @return
     */
    public BigDecimal selectSellFirstPrice(@Param("marketId") Long marketId);
}
